///*
// * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
// * <p>
// * Licensed under the Apache License, Version 2.0 (the "License"); you may not
// * use this file except in compliance with the License. You may obtain a copy of
// * the License at
// * <p>
// * https://www.apache.org/licenses/LICENSE-2.0
// * <p>
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// * License for the specific language governing permissions and limitations under
// * the License.
// */
//package com.ctrip.corp.obt.shard.sql.parser.table;
//
//
//import com.ctrip.corp.obt.generic.utils.CollectionUtils;
//import com.ctrip.corp.obt.generic.utils.StringPool;
//import com.ctrip.corp.obt.generic.utils.StringUtils;
//import com.ctrip.corp.obt.shard.annotation.ShardModel;
//import com.ctrip.corp.obt.shard.context.TenantContext;
//import com.ctrip.corp.obt.shard.holder.ShardModelHolder;
//import com.ctrip.corp.obt.shard.sql.parser.AbstractSqlParser;
//import lombok.Data;
//import lombok.EqualsAndHashCode;
//import lombok.experimental.Accessors;
//import lombok.extern.slf4j.Slf4j;
//import net.sf.jsqlparser.schema.Table;
//import net.sf.jsqlparser.statement.delete.Delete;
//import net.sf.jsqlparser.statement.insert.Insert;
//import net.sf.jsqlparser.statement.select.FromItem;
//import net.sf.jsqlparser.statement.select.PlainSelect;
//import net.sf.jsqlparser.statement.update.Update;
//
//import java.util.Arrays;
//import java.util.Set;
//import java.util.stream.Collectors;
//
//import static com.ctrip.corp.obt.generic.utils.StringPool.UNDERSCORE;
//
//
///**
// * TableReroute SQL 解析器
// *
// * @author marco.zheng
// * @since 2022-02-10
// */
//@Data
//@Slf4j
//@Accessors(chain = true)
//@EqualsAndHashCode(callSuper = true)
//public class TableRerouteSqlParser extends AbstractSqlParser {
//
//    private TableRerouteHandler rerouteHandler;
//
//    /**
//     * insert 语句处理
//     */
//    @Override
//    public void processInsert(Insert insert) {
//        Table table = insert.getTable();
//        if (this.rerouteHandler.doTableFilter(table.getName())) {
//            // 过滤退出执行
//            return;
//        }
//        // 重新路由table
//        rerouteTable(table);
//    }
//
//    /**
//     * update 语句处理
//     */
//    @Override
//    public void processUpdate(Update update) {
//        Table table = update.getTable();
//        if (this.rerouteHandler.doTableFilter(table.getName())) {
//            // 过滤退出执行
//            return;
//        }
//        // 重新路由table
//        rerouteTable(table);
//    }
//
//    /**
//     * delete 语句处理
//     */
//    @Override
//    public void processDelete(Delete delete) {
//        Table table = delete.getTable();
//        if (this.rerouteHandler.doTableFilter(table.getName())) {
//            // 过滤退出执行
//            return;
//        }
//        // 重新路由table
//        rerouteTable(table);
//    }
//
//    /**
//     * 处理 PlainSelect
//     *
//     * @param plainSelect ignore
//     */
//    @Override
//    public void processPlainSelect(PlainSelect plainSelect) {
//        FromItem fromItem = plainSelect.getFromItem();
//        if (fromItem instanceof Table) {
//            Table fromTable = (Table) fromItem;
//            if (!this.rerouteHandler.doTableFilter(fromTable.getName())) {
//                // 重新路由table
//                rerouteTable(fromTable);
//            }
//        }
//    }
//
//
//    /**
//     * 将原始的table进行reroute，table的后缀为 {@link TenantContext#getTableShardSource()}
//     * @param table
//     */
//    private void rerouteTable(Table table) {
//        // 当配置了ShardModel之后，如果未配置targetTables，则对[当前事务中所有的表]按照配置的tableStrategy进行分片
//        // 否则只对[targetTables中的表]进行分片处理
//        if (Boolean.TRUE.equals(TenantContext.isAllowTableReroute())) {
//            Set<String> routeTables = ShardModelHolder.getShardModelCache().values().stream()
//                    .map(ShardModel::targetTables)
//                    .flatMap(targetTables -> Arrays.stream(targetTables.split(StringPool.COMMA)))
//                    .filter(StringUtils::isNotBlank)
//                    .collect(Collectors.toSet());
//            if (null != TenantContext.getTableShardSource()) {
//                if (CollectionUtils.isNotEmpty(routeTables) && !routeTables.contains(TenantContext.getTableShardSource())) {
//                    return;
//                }
//                table.setName(table.getName() + UNDERSCORE +  TenantContext.getTableShardSource());
//            }
//        }
//    }
//}
